/*
'==' 的隐式类型转换规则

如果类型相同，无须进行类型转换；

如果其中一个操作值是 null 或者 undefined，那么另一个操作符必须为 null 或者 undefined，才会返回 true，否则都返回 false；

如果其中一个是 Symbol 类型，那么返回 false；

两个操作值如果为 string 和 number 类型，那么就会将字符串转换为 number；

如果一个操作值是 boolean，那么转换成 number；

如果一个操作值为 object 且另一方为 string、number 或者 symbol，就会把 object 转为原始类型再进行判断（调用 object 的 valueOf/toString 方法进行转换）。
 */

console.log(null == undefined)       // true  规则2

console.log(null == 0)               // false 规则2

console.log('' == null)              // false 规则2

console.log('' == 0)                 // true  规则4 字符串转隐式转换成Number之后再对比

console.log('123' == 123)            // true  规则4 字符串转隐式转换成Number之后再对比

console.log(0 == false)              // true  e规则 布尔型隐式转换成Number之后再对比

console.log(1 == true)               // true  e规则 布尔型隐式转换成Number之后再对比

var a = {

    value: 0,

    valueOf: function () {

        this.value++;

        return this.value;

    }

};

// 注意这里a又可以等于1、2、3

console.log(a == 1 && a == 2 && a == 3);  //true f规则 Object隐式转换
console.log(a == 1 && a == 2 && a == 3);  //false 注：但是执行过3遍之后，再重新执行a==3或之前的数字就是false，因为value已经加上去了，这里需要注意一下
